const express = require('express');
const fs = require('fs');
const path = require('path');
const app = express();
app.listen(3000,()=>{
    console.log('web服务器工作在3000端口');
});

// let obj = {};
// obj.x = 99;


//定义函数：
//req:request请求对象
//res:response响应对象
//next:方法
function getCurTime(req,res,next){
    // console.log(next,req,'Hello....');
   //console.log(next,'Hello....');
      let curTime = new Date().getTime();
      req.Times = curTime;

      //注意：
      //1、调用next()方法：next()可以查找并执行后面能匹配上的路由
      //2、当给next()方法传参时则next()方法默认把参数值直接输出到界面上，如果我们定义了含有err,req,res,next这四个参数的逻辑错误处理中间件时，则next()方法会自动查找并执行逻辑错误处理中间件并将next()方法中的参数传递给逻辑错误处理中间件中第一个形参err
      
      

     // if(1){  //正常
      if(0){  //正常
        next();
      }else{ //异常
         next('异常错误信息!!');
      }

}

function myTest(req,res,next){
     console.log('Hello WEB!');
     next();
}

//使用中间件函数:【重点】
//使用中间件函数的代码通常放成所有路由的最前面
app.use(myTest);
app.use(getCurTime);
//app.use('/teacher',getCurTime);



//显示老师界面：
app.get('/teacher',(req,res)=>{
//    res.send(`这是老师界面:${new Date().getTime()}`);
res.send(`这是老师界面:${req.Times} ...`);
});


//app.use(getCurTime);

//显示学生界面：
app.get('/student',(req,res)=>{

    // res.send(`学生界面！:${new Date().getTime()}`);
    res.send(`学生界面:${req.Times} ...`);
});


//逻辑错误处理中间件：
function errorLog(err,req,res,next){
   // console.log(err,'err');

   //将错误信息err写入到error.txt文件中： 
   fs.writeFileSync(path.join(__dirname,'error.txt'),err,{flag:'a+'});


    res.send('自定义中间件执行异常');
}
app.use(errorLog);


// app.all('*',(req,res)=>{
//    res.send(`这是404错误！！`);
// });

//404错误处理中间件：app.use([前缀,]中间件函数);
app.use('*',function(req,res,next){
     res.send(`404错误！`);
});